package com.syedu.day16;

import java.io.RandomAccessFile;

/**
 * description：RandomAccessFile,随机访问存取流
 * 可以在文件任意位置进行读或者写的操作,它是一个组合流(基本流+拓展流)
 *
 * @author Administrator
 * @date 2022/4/8 9:46
 */
public class RandomAccessFileDemo {
    public static void main(String[] args) {
        String lastLine = readLastLine("D:\\BAM练习.txt");
        System.out.println("文件最后一行内容为: " + lastLine);
    }

    /**
     * 业务要求:
     * 读取一个超大型文件(2G以上的文本文件)的最后一行内容
     */
    public static String readLastLine(String path) {
        String lastLine = null;
        /**
         * RandomAccessFile构建时,必须设置打开模式,一般模式为:
         * r 只读模式,rw 读写模式,当然还有rws,rwd
         */
        try (RandomAccessFile randomAccessFile = new RandomAccessFile(path, "r")) {
            //获取文件大小
            long pos = randomAccessFile.length();
            //定义状态变量
            boolean flag = true;
            //循环反向读取单个字节,如果读取到换行等情况,则表示最后一行已读完
            int len = -1;
            while(flag){
                //把文件指针定位到文件末尾
                randomAccessFile.seek(--pos);
                //读取一个字节
                len = randomAccessFile.read();
                //判断该字符
                switch (len){
                    case '\n'://换行
                    case '\r'://回车
                    case -1://文件中就是一整行内容,-1表示读取完毕
                        //说明已经读到换行符,则重新定位+1,定位到最后一行的起始位置
                        randomAccessFile.seek(pos + 1);
                        flag = false;
                }
            }
            //此时,光标已经在最后一行的起始位置了,直接读取一行即可
            //通过字符串硬编码解决乱码问题
            lastLine = new String(randomAccessFile.readLine().getBytes("ISO-8859-1"),"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return lastLine;
    }
}